public class Table 
{
	
	/*
	 * Stół mógłby wywoływac gracza i talie
	 */
	
	Human tabLudzi[];
	Bot tabBotow[];
	Deck talia;
	int iloscGraczy;  
	int iloscBotow;
	int iloscLudzi;
	public String lego[]=new String[5];
	
	Table(int ludzie,int boty)
	{
		iloscLudzi=ludzie;
		iloscBotow=boty;
		tabLudzi=new Human[ludzie];
		tabBotow=new Bot[boty];
		iloscGraczy = boty + ludzie;		
		talia=new Deck();
		talia.tasujTalie();
		talia.tasujTalie();
		talia.tasujTalie();
		
		for(int i=0;i<ludzie;i++)
			tabLudzi[i]=new Human("Player "+(i+1));
		for(int i=0;i<boty;i++)
			tabBotow[i]=new Bot("Bot "+(i+1));
		
	}
	
	public void pierwszeRozdanie()
	{
		int j=0;
		if(iloscLudzi!=0)
			for( j =0;j<iloscLudzi;j++)
				tabLudzi[j].hand=talia.rozdaj(5);
				
		if(iloscBotow!=0)
			for( int i =0;i<iloscBotow;i++)
				tabBotow[i].hand=talia.rozdaj(5);		
		
		
	//	jakieKarty();
	}

	public void jakieKarty(int nrGracza ) {
	//	int j;
	//	j=0;
	//	if(iloscLudzi!=0)
	//	{

		//	for( j =0;j<iloscLudzi;j++)
		//	{	
			//	System.out.println(tabLudzi[j].imie);
				for(int z=0;z<5;z++ )
					lego[z]=Card.hiMyNameIsWhaaatTikiTikiSlimShady(tabLudzi[nrGracza].hand[z]);

		//	}
		//}
	}

	public String[] przekazWynik(int nrGracza)
	{
		for(int z=0;z<5;z++ )
			lego[z]=Card.hiMyNameIsWhaaatTikiTikiSlimShady(tabLudzi[nrGracza].hand[z]);
		return lego;
	}
	
	public String[] przekazWynikBot(int nrGracza)
	{
		for(int z=0;z<5;z++ )
			lego[z]=Card.hiMyNameIsWhaaatTikiTikiSlimShady(tabBotow[nrGracza].hand[z]);
		return lego;
	}
	
	
	public void wymienKarty(int[] kartyDoWymiany,int nrGracza)
	{tabLudzi[nrGracza].step1(kartyDoWymiany,talia.rozdaj(kartyDoWymiany.length));}
	
	public void fazaWymianyDlaBota() {
		if(iloscBotow!=0)
		{
			for(int i=0;i<iloscBotow;i++)
			{

				tabBotow[i].ukladGracza(sprawdzRenke(tabBotow[i].hand));
				tabBotow[i].botChangeCards();
				for(int w=0;w<5;w++)
					if(tabBotow[i].hand[w]==-1)
						System.arraycopy(talia.rozdaj(1), 0, tabBotow[i].hand, w, 1);	
			}
		}
	}
	
	public String ktoWygral()
	{
		int tablica[]={0,0,0,0};
		int j=0;
		
		if(iloscLudzi!=0)
			for( j =0;j<iloscLudzi;j++)
			{	
				tabLudzi[j].ukladGracza(sprawdzRenke(tabLudzi[j].hand));
				tablica[j]=tabLudzi[j].ukladMa[0];
				System.arraycopy(magicznaFunkcja(tabLudzi[j]), 0, tabLudzi[j].dziwnaTablica, 0, 6);		
			}		
		if(iloscBotow!=0)
			for( int i =0;i<iloscBotow;i++)
			{
				tabBotow[i].ukladGracza(sprawdzRenke(tabBotow[i].hand));
				tablica[j]=tabBotow[i].ukladMa[0];
				System.arraycopy(magicznaFunkcja(tabBotow[i]), 0, tabBotow[i].dziwnaTablica, 0, 6);
				j++;
			}
//			System.out.println(tablica[0]+" "+tablica[1]+" "+tablica[2]+" "+tablica[3]);
			j=tablica[0];
			int nr=0;
			int ileTakSam=0;
			int tabTakSam[]={7,7,7,7};
			for(int i=1;i<4;i++)
				if(tablica[i]>j)
				{
					nr=i;
					j=tablica[nr];
				}
			int g=0;
			for(int i=0;i<4;i++)
				if(tablica[i]==tablica[nr])
				{
					ileTakSam++;
					tabTakSam[g]=i;
					g++;
				}
					
			if(ileTakSam==1)
			{
				if(nr>(iloscLudzi-1))
					return tabBotow[nr-iloscLudzi].imie;
				else
					return tabLudzi[nr].imie;
			}
			else
			{
		//		Player nikt=new Player("nobody");
		//		for (int e=0;e<6;e++)
		//			nikt.dziwnaTablica[e]=0;
				Player tabqwe[]=new Player[iloscGraczy];
				j=0;
				if(iloscLudzi!=0)
					for( j =0;j<iloscLudzi;j++)
						tabqwe[j]=tabLudzi[j];					
				if(iloscBotow!=0)
					for( int i =0;i<iloscBotow;i++)
					{
						tabqwe[j]=tabBotow[i];
						j++;
					}
				
				for(int q=1;q<6;q++)
				{
					for(int r=0;r<4;r++)
						if(tabTakSam[r]!=7)
							tablica[tabTakSam[r]]+=tabqwe[tabTakSam[r]].dziwnaTablica[q];			

					j=tablica[0];
					nr=0;
					ileTakSam=0;
					for(int i=1;i<4;i++)
						if(tablica[i]>j)
						{
							nr=i;
							j=tablica[nr];
						}
					
					g=0;
					for(int y=0;y<4;y++)
						tabTakSam[y]=7;
					for(int i=0;i<4;i++)
						if(tablica[i]==tablica[nr])
						{
							ileTakSam++;
							tabTakSam[g]=i;
							g++;
						}	
				
					if(ileTakSam==1)
					{
						if(nr>(iloscLudzi-1))
							return tabBotow[nr-iloscLudzi].imie;
						else
							return tabLudzi[nr].imie;
					}
					
				}
			}					
				
		return "REMIS";
	}

	public int[] magicznaFunkcja(Player zaw)
	{	
		int[] tabol=new int[6];
		int dlug=zaw.ukladMa.length;
		tabol[0]=zaw.ukladMa[0];
		if(zaw.ukladMa[0]!=5)
		{	
			int ddd[]=new int[zaw.ukladMa.length-1];
			System.arraycopy(zaw.ukladMa, 1, ddd, 0, zaw.ukladMa.length-1);
			ddd=sortujRenke(ddd);
			System.arraycopy(ddd, 0, tabol, 1, dlug-1);
		}
		else
		{
			int var1,var2;
			var2=9294929;
			int count=1;
			var1=zaw.ukladMa[1];
			for(int i=2;i<6;i++)
			{
				if(var1==zaw.ukladMa[i])
					count++;
				else
					var2=zaw.ukladMa[i];
			}
			if(count==3)
			{
				tabol[1]=var1;
				tabol[2]=var1;
				tabol[3]=var1;
				tabol[4]=var2;
				tabol[5]=var2;
			}
			else
			{
				tabol[1]=var2;
				tabol[2]=var2;
				tabol[3]=var2;
				tabol[4]=var1;
				tabol[5]=var1;
			}
			return tabol;
		}
		int i,j,k;
		System.arraycopy(zaw.ukladMa, 0, tabol, 0, dlug);
		
		for(i=1;i<dlug;i++)
			tabol[i]=tabol[i]%13;
		
		zaw.hand=sortujRenke(zaw.hand);
		
		i=dlug;
		for(j=0;j<5;j++)
		{
			for(k=1;k<dlug;k++)
				if(tabol[k]==zaw.hand[j])
					break;
			if(k==dlug)
			{
				tabol[i]=zaw.hand[j];
				i++;
			}
		}
		return tabol;
	}
	public void pokazWszystko()
	{
		int j=0;
		if(iloscLudzi!=0)
		{

			for( j =0;j<iloscLudzi;j++)
			{	
				System.out.println(tabLudzi[j].imie);
				for(int z=0;z<5;z++ )
					Card.hiMyNameIsWhaaatTikiTikiSlimShady(tabLudzi[j].hand[z]);

				System.out.println("------------------------- ");

			}	
				
		}
		if(iloscBotow!=0)
			for( int i =0;i<iloscBotow;i++)
			{
				System.out.println(tabBotow[i].imie);
				for(int z=0;z<5;z++ )
					Card.hiMyNameIsWhaaatTikiTikiSlimShady(tabBotow[i].hand[z]);

				System.out.println("------------------------- ");
			}	
		
	}
	public int[] sprawdzRenke(int reka[])
	{
		int rozmiar;
		int wynik[];
		int x=0;
		int count=0;
		int tab[] = new int[5];
		int uklad=0;
		for(int i =0;i<5;i++)
		{
			for(int j=0;j<5;j++)
				if((reka[i]%13)==(reka[j]%13))
					count++;
			if(x<=count)
				x=count;
			tab[i]=count;
			count=0;
		}			
		
		/*
		 * Sprawdzamy czy ręka ma dwie pary
		 */
		if(x==2)
		{
			for(int i =0;i<5;i++)
				if(tab[i]==2)
					count++;
			if(count==4)
				uklad=4;//dwie pary
		}
		/*
		 * Sprawdzamy czy ręka ma fulla
		 */
		if(x==3)
		{
			for(int i =0;i<5;i++)
				if(tab[i]==2)
					uklad=5;//full
		}
		
		//inne możliwości ukłaadow opierajace sie na powtarzanej kaarcie
		if(uklad==0)
		{
			switch(x)
			{
			case 1: uklad =1;break;//najwyższa karta
			case 2: uklad =2;break;//para
			case 3: uklad =3;break;//trojka
			case 4: uklad =6;break;//kareta	
			}
		}
		
		/*
		 * jeśli żadne karty sie niepowtarzają
		 * sprawdzamy czy mamy kolor
		 * nastepnie czy mamy strita
		 * jesli oba-> to jest poker
		 */
		if(uklad==1)
		{
			//sprawdazmy czy jest kolor
			count=0;
			int y = reka[0]/13;
			for(int i =1;i<5;i++)
				if(y!=(reka[i]/13))
					break;
				else
					count++;
			if(count==4)
				uklad=8;//kolor
			
			//sprawdzamy czy jest strit
			count=0;
			y=reka[0]%13;
			for(int i=1;i<5;i++)
				if((reka[i]%13)<y)
					y=reka[i];
			for(int i=1;i<5;i++)
			{
				if((reka[i]%13)==y+1)
				{
					y=reka[i]%13;
					count++;
					if(count==4)
						if(uklad==8)
							uklad=9;//jesli jest strit i kolor to jest poker
						else
							uklad=7;//strit
				}	
				else
					break;
			}		
		}
	
		switch(uklad)
		{
		case 1: rozmiar =2;break;//najwyższa karta
		case 2: rozmiar =3;break;//para
		case 3: rozmiar =4;break;//trojka
		case 4: rozmiar =5;break;	
	//	case 5: rozmiar =6;break;
		case 6: rozmiar =5;break;
		default: rozmiar = 6;break;
		}
				
		wynik=new int[rozmiar];
		wynik[0]=uklad;
		if(rozmiar!=6 && rozmiar!=2)
		{
			int z=1;
			for(int i =0;i<5;i++)
			{	
				if(tab[i]==x)
				{	
					wynik[z]=reka[i];
					z++;
				}	
			}
		}
		else
		{
			if(rozmiar==6)
				System.arraycopy(sortujRenke(reka),0,wynik,1, 5);
	
			else
			{
				
				wynik[1]=reka[0]%13;
				for(int i=1;i<5;i++)
					if((reka[i]%13)>wynik[1])
						wynik[1]=reka[i];
			}
		}
		return wynik;//pierwsza liczba w tablicy to układ (liczby 1 -9) 
		/*
		 * nastepne liczby to karty ktore tworza układ
		 * 
		 * caalosc robiona dosc topornie i chyba baardziej strukturalnie niz obiektowo 
		 * 
		 * według hierarchi:
		 * 1-najwyższa karta 
		 * 2-para
		 * 3-trojka
		 * 4-dwie pary
		 * 5-full
		 * 6-kareta
		 * 7-strit
		 * 8-kolor
		 * 9-poker
		 * 
		 */
	}
	static int[] sortujRenke(int tab[])
	{
		int dlugosc=tab.length;
		int temp,najw;
		int tablica[]=new int[dlugosc];
		System.arraycopy(tab,0,tablica, 0, dlugosc);
		
		for(int i=0;i<tab.length-1;i++)
		{
			najw=tablica[i]%13;
			for(int j=i+1;j<tab.length;j++)
			{
				if(najw<tablica[j]%13)
				{
					temp=najw;
					najw=tablica[j]%13;
					tablica[j]=temp;
					tablica[i]=najw;
				}
				tablica[i]=najw;
			}
		}
		tablica[tab.length-1]=tablica[tab.length-1]%13;
		return tablica;
	}
}